﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DECOR.BL.BE;
using DECOR.DL.DALCF;

namespace DECOR.BL.BC
{
    public class ClienteBC
    {
        #region Singleton
        private ClienteBC() { }
        private static ClienteBC _instance = null;
        public static ClienteBC Instance
        {
            get { return (_instance == null) ? _instance = new ClienteBC() : _instance; }
        }
        #endregion

        /// <summary>
        /// Devuelve los datos de un cliente a partir de un código.
        /// </summary>
        /// <param name="pCodigo">Código del cliente.</param>
        public ClienteBE leer(string pCodigo)
        {
            return DaoFactory.ClienteDALC.leer(pCodigo.PadLeft(10, '0'));
        }

        /// <summary>
        /// Devuelve una lista de clientes en base a un críterio de busqueda.
        /// </summary>
        /// <param name="pNombre">Nombre o parte del nombre.</param>
        public List<ClienteBE> buscar(string pNombre)
        {
            return DaoFactory.ClienteDALC.buscar(pNombre);
        }


        //-----------
        /// <summary>
        /// Devuelve lista de las organizaciones de venta asociado a un cliente.
        /// </summary>
        /// <param name="pCodigo">Código del cliente.</param>
        public List<GenericBE> listaOrgVtas(string pCodCliente)
        {
            return DaoFactory.ClienteDALC.listaOrgVtas(pCodCliente);
        }

        /// <summary>
        /// Devuelve lista de los caneles asociado a un cliente.
        /// </summary>
        /// <param name="pCodigo">Código del cliente.</param>
        /// <param name="pCodOrgVtas">Código de organización de ventas.</param>
        public List<GenericBE> listaCanalDist(string pCodCliente, string pCodOrgVtas)
        {
            return DaoFactory.ClienteDALC.listaCanalDist(pCodCliente, pCodOrgVtas);
        }

        /// <summary>
        /// Devuelve lista completa de sectores.
        /// </summary>
        public List<GenericBE> listaSectores()
        {
            return DaoFactory.ClienteDALC.listaSectores();
        }

        /// <summary>
        /// Busca a un vendedor en específico de acuerdo al cliente, organización de ventas y canal.
        /// </summary>
        /// <param name="pCodigo">Código del cliente.</param>
        /// <param name="pCodOrgVtas">Código de organización de ventas.</param>
        /// <param name="pCodCanalDist">Código de canal.</param>
        public PersonaBE buscaVendedor(string pCodCliente, string pCodOrgVtas, string pCodCanalDist)
        {
            return DaoFactory.ClienteDALC.buscaVendedor(pCodCliente, pCodOrgVtas, pCodCanalDist);
        }

        /// <summary>
        /// Busca Condicion Pago y Expedicion
        /// </summary>
        /// <param name="pCodCliente">Código de cliente.</param>
        /// <param name="pCodOrgVtas">Código de Organización de ventas.</param>
        /// <param name="pCodCanalDist">Código de Canal de distribución.</param>
        /// <param name="pCodSector">Código de sector.</param>
        /// <param name="pCondPago">Valor de retorno: Clave de condiciones de pago.</param>
        /// <param name="pCondExp">Valor de retorno: Condición de expedición.</param>  
        public void infoClienteNac(string pCodCliente, string pCodOrgVtas, string pCodCanalDist, string pCodSector, out string pCondPago, out string pCondExp)
        {
            DaoFactory.ClienteDALC.infoClienteNac(pCodCliente, pCodOrgVtas, pCodCanalDist, pCodSector, out pCondPago, out pCondExp);
        }

        /// <summary>
        /// Valida a un interlocutor dependiendo código de interlocutor, organización de ventas, canal y sector.
        /// </summary>
        /// <param name="pClienteBE">Datos del cliente. Entre ellos el código del cliente.</param>
        /// <param name="pCodOrgVtas">Código de Organización de ventas.</param>
        /// <param name="pCodCanalDist">Código de Canal de distribución.</param>
        /// <param name="pCodSector">Código de sector.</param>
        public string validaInterlocutor(ref ClienteBE pClienteBE, string pCodOrgVtas, string pCodCanalDist, string pCodSector)
        {
            return DaoFactory.ClienteDALC.validaInterlocutor(ref pClienteBE, pCodOrgVtas, pCodCanalDist, pCodSector);
        }

        /// <summary>
        /// Valida el RUC dependiento de la Organización de Ventas.
        /// </summary>
        /// <param name="pRuc">RUC del cliente.</param>
        /// <param name="pOrgVtas">Código de Organización de ventas.</param>
        public string validaRUC(string pRuc, string pOrgVtas)
        {
            return DaoFactory.ClienteDALC.validaRUC(pRuc, pOrgVtas);
        }

        /// <summary>
        /// Lista de Clientes según parámetros
        /// </summary>
        /// <param name="pNombre">Nombre del cliente</param>
        /// <param name="pIdentifFiscal">Número fiscal</param>
        /// <param name="pNumeroDeudor">Número deudor</param>
        /// <returns>Devuelve una lista de clientes</returns>
        public List<ClienteBE> busquedaCliente(string pNombre, string pIdentifFiscal, string pNumeroDeudor)
        {
            return DaoFactory.ClienteDALC.busquedaCliente(pNombre, pIdentifFiscal, pNumeroDeudor);
        }
        /// <summary>
        /// Búsqueda de clientes en la tabla Reniec (ZTSD_CLIENTES)
        /// </summary>
        /// <param name="pNumDoc">Número de documento del cliente.</param>
        /// <param name="pResult">Si es 00 indica que existe datos, caso contrario no se encontró el cliente.</param>
        /// <returns></returns>
        public ClienteBE busquedaClienteReniec(string pNumDoc, string pNombre, string pApePat, string pApeMat, out string retval)
        {
            return DaoFactory.ClienteDALC.busquedaClienteReniec(pNumDoc.Trim(), 
                                    pNombre != null ? pNombre.Trim() : "", 
                                    pApePat != null ? pApePat.Trim() : "", 
                                    pApeMat != null ? pApeMat.Trim() : "",
                                    out retval);
        }

        /// <summary>
        /// Lista de Grado de Instrucción
        /// </summary>
        /// <returns></returns>
        public List<GenericBE> ListarGradoInstruccion()
        {
            return DaoFactory.ClienteDALC.ListarGradoInstruccion();
        }

        public List<ClientePreResBE> ListaPreguntas()
        {
            return DaoFactory.ClienteDALC.ListaPreguntas();
        }

        public void insertClienteReniec(ClienteBE objCliente, out string result)
        {
            DaoFactory.ClienteDALC.insertClienteReniec(objCliente, out result);
        }

        public void insertClientePregRep(List<ClienteBE> listCliente)
        {
            DaoFactory.ClienteDALC.insertClientePregRep(listCliente);
        }

        public List<ClienteBE> busquedaClientePregRep(string numDoc)
        {
            return DaoFactory.ClienteDALC.busquedaClientePregRep(numDoc);
        }
    }
}
